package io.summer.gadget.channel;

import io.summer.gadget.channel.core.TopicListener;
import io.summer.gadget.channel.core.impl.ChannelConsumer;

import java.lang.reflect.Type;
import java.util.List;

/**
 * @author ml
 * 简单的服务间调用通道，依赖redis
 * 复杂场景使用gRPC
 */
public interface SummerChannel {

  /**
   * 订阅一个事件处理
   * @param topic
   * @param consumer
   */
  <T, R> void subscribe(String topic, TopicListener<T, R> consumer);

  <T> void publish(String topic, T data);

  void publish(String topic, byte[] data);

  /**
   * 等待返回值的发布，当有多个不同服务实例时，返回值来源是"不确定"的
   * @param topic
   * @param responseType
   * @param data
   * @param <T>
   * @param <R>
   * @return
   */
  <T, R> R publish(String topic, Class<R> responseType, T data);

  <R> R publish(String topic, Class<R> responseType, byte[] data);

  <T, R> R publish(String topic, Type responseType, T data);

  <R> R publish(String topic, Type responseType, byte[] data);

  <T> void publishAsync(String topic, T data);

  void publishAsync(String topic, byte[] data);

  List<ChannelConsumer> getChannelConsumers(String topic);
}
